﻿using Newtonsoft.Json;
using ReactiveUI.Fody.Helpers;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common.Utils;
using Common.ViewModels.Messages;
using System.Runtime.ConstrainedExecution;

namespace Common.ViewModels
{
    


    /// <summary>
    /// 摆渡组(多个摆渡组成一个组,核心是一个调度系统,节点的调度切换为三个摆渡的调度,这里节点调度通过Group调度,切换CanMove1Help,这里区别于小车，容易形成死锁，所以用调度解决死锁问题)
    /// </summary>
    public class BoatVMGroup : BaseViewModel
    {

        public BoatVMGroup()
        {
            MessageAggregator<占用路口释放占用Msg>.Subscribe(占用路口释放占用Msg);
        }

        private void 占用路口释放占用Msg(占用路口释放占用Msg msg)
        {
            lock (m_locker十字路口通行状态)
            {
                if (msg.占用对象 == this.红绿灯占用对象)
                {
                    this.红绿灯占用对象 = null;//释放占用对象
                }
            }
        }

        /// <summary>
        /// 到码头时，分别在前等待位和后等待位进行等待
        /// </summary>
        [Reactive] public Station 上等待位 { get; set; }

        /// <summary>
        /// 后等待位
        /// </summary>
        [Reactive] public Station 下等待位 { get; set; }

        /// <summary>
        /// 躲避站点1
        /// </summary>
        [Reactive] public Station 避让站点1 { get; set; }

        // <summary>
        /// 躲避站点1
        /// </summary>
        [Reactive] public Station 避让站点2 { get; set; }

        /// <summary>
        /// 中心站点
        /// </summary>
        [Reactive] public Station 中心站点 { get; set; }


        /// <summary>
        /// 右待位
        /// </summary>
        [Reactive] public Station 右等待位 { get; set; }

        /// <summary>
        /// 第一个摆渡(靠左)
        /// </summary>
        public BoatVM BoatVm1 { get; set; }

        /// <summary>
        /// 第二个摆渡
        /// </summary>
        public BoatVM BoatVm2 { get; set; }

        /// <summary>
        /// 第三个摆渡(靠近核心)
        /// </summary>
        public BoatVM BoatVm3 { get; set; }

        

        [Reactive] private IName 红绿灯占用对象 { get; set; }

        /// <summary>
        /// 摆渡站点列表
        /// </summary>
        public ObservableCollection<BoatStation> BoatStations { get; set; }=new ObservableCollection<BoatStation>();

        /// <summary>
        /// 绑定的区号叫号系统(部分站点需要取号才能进行移动,一次取号锁定)
        /// </summary>
        [Reactive] public 取号叫号系统 取号叫号系统 {  get; set; }

        private readonly object m_locker十字路口通行状态 = new ();

        [JsonIgnore]
        [Reactive] public 红绿灯状态 红绿灯状态 { get; set; }

        public bool 请求进入摆渡组(Station station,IName car)
        {
            if (station== 下等待位)
            {
                return 检查红绿灯信号(station, car, 红绿灯状态.竖直可通行); ;
            }

            if (station == 上等待位)
            {
                return 检查红绿灯信号(station, car, 红绿灯状态.竖直可通行); 
            }

            if (station == 避让站点2)
            {
                return 检查红绿灯信号(station, car, 红绿灯状态.水平可通行);
            }

            if (station == 右等待位)
            {
                return 检查红绿灯信号(station, car, 红绿灯状态.水平可通行);
            }


            return true;
        }

        

        //将进入到站点
        public bool 从底下进入摆渡组(Station station, IName car)
        {
            return 检查红绿灯信号(station, car, 红绿灯状态.水平可通行);
        }

        public bool 检查红绿灯信号(Station station, IName car, 红绿灯状态 请求状态)
        {
            lock (m_locker十字路口通行状态)
            {
                if (this.红绿灯状态 == 请求状态)
                {
                    return true;
                }

                //没有占用对象 可以解除占用
                if (this.红绿灯占用对象 == null)
                {
                    //可以解除红灯  恢复绿灯
                    this.红绿灯占用对象 = car;
                    this.红绿灯状态 = 请求状态;
                    return true;
                }
                else
                {
                    //有占用对象 需要等待占用对象主动解除占用
                    return false;
                }
            }
        }


        /// <summary>
        /// 开始处理,情况为  请求进入,
        /// </summary>
        public void StartDeal()
        {

        }

        /// <summary>
        /// 请求
        /// </summary>
        public void Request()
        {

        }

        /// <summary>
        /// 根据两个轨迹判断路径是否重合
        /// </summary>
        /// <param name="stations1"></param>
        /// <param name="stations2"></param>
        public void 判断路径是否重合(List<Station> stations1, List<Station> stations2)
        {

        }


        
    }

    /// <summary>
    /// 
    /// </summary>
    public enum 红绿灯状态
    {
        竖直可通行,
        水平可通行,
    }

    

   






    /// <summary>
    /// 一个码头有多个摆渡(作为一个可以到达的节点)
    /// </summary>
    [Serializable]
    [JsonObject(MemberSerialization.OptOut)]
    public class 码头 : ViewModelBase
    {
        [Reactive] public string Name { get; set; }

        [Reactive] public string Description { get; set; }

        /// <summary>
        /// 摆渡列表(这里需要按照顺序来渡  先1后2再三)
        /// </summary>
        public ObservableCollection<BoatVM> BoatVMs { get; set; } = new ObservableCollection<BoatVM>();

        [Reactive] public int 摆渡数量 { get; set; }

        /// <summary>
        /// 接驳摆渡(接驳摆渡 这里需要将摆渡移动至工位,)
        /// </summary>
        [Reactive] public BoatVM BoatVM { get; set; }

        /// <summary>
        /// 接驳的位置
        /// </summary>
        [Reactive] public double Position { get; set; }

        /// <summary>
        /// 到码头时，分别在前等待位和后等待位进行等待
        /// </summary>
        [Reactive] public Station 前等待位 { get; set; }

        /// <summary>
        /// 当前码头摆渡的索引 可为0 1 2 3 / 0.5(当为0.5时需要等待 需要小车先移动到码头等待位  进行等待)
        /// </summary>
        [JsonIgnore][Reactive] public double 码头摆渡索引 { get; set; } = 0;

        [Reactive] public Station 后等待位 { get; set; }


        /// <summary>
        /// 获取
        /// </summary>
        /// <returns></returns>
        public bool 获取能否运动到工作区()
        {
            bool ret = false;

            return true;
        }



    }
}
